perm filename INTFAC.PAL[AL,HE]1 blob
sn#266445 filedate 1978-03-23 generic text, type C, neo UTF8
COMMENT ā VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 .TITLE INTFAC
C00003 00003 ARM INTERFACE DEFINITIONS
C00005 00004 PROGRAM INITIALIZATION
C00007 00005 ADC TEST SECTION
C00010 00006 SUBRS AND CLOCK INTERRUPT ROUTINE
C00012 00007 LOCAL STORAGE
C00014 ENDMK
Cā;
.TITLE INTFAC
;REGISTER DEFINITIONS
R0 =%0
R1 =%1
R2 =%2
R3 =%3
R4 =%4
R5 =%5
SG =%5
SP =%6
PC =%7
;OTHER RANDOM DEFINITIONS
CLKSET =172542 ;CLOCK SET REGISTER
CLKS =172540 ;CLOCK STATUS
CLKTRP =104 ;CLOCK TRAP
LV7 ==340 ;LEVEL 7 CPU STATUS
DDT =130000 ;DEBUGGER
STKTOP =1000 ;TOP OF USER STACK
;I/O ROUTINES START HERE
.=STKTOP
LSI ==0
TALK10 ==1
NOCOMA ==0
BADNUM ==0
ABORT ==0
.INSRT IO.PAL[NEW,BES]
;ARM INTERFACE DEFINITIONS
DRATRP =310 ;DR11 A VECTOR
DRBTRP =314 ;DR11 B VECTOR
DR11S =167770 ;DR11 STATUS WORD
DR11O =167772 ;DR11 OUTPUT REGISTER
DR11I =167774 ;DR11 INPUT REGISTER
;DR11C STATUS REGISTER BIT DEFINITIONS
DACMDE ==0 ;CSR MODE BITS, DAC MODE
BRKMDE ==1 ; " " " , BRAKE REGISTER MODE
ADCMDE ==2 ; " " " , ADC MODE
STTMDE ==3 ; " " " , STATUS REGISTER READ MODE
ADCENB ==100 ;ADC INTERRUPT ENABLE BIT
ADCDNE ==200 ;ADC DONE BIT
STTENB ==40 ;STATUS REGISTER INTERRUPT ENABLE BIT
STTREQ ==100000 ;STATUS REGISTER REQUEST INTERRUPT BIT
;DR11C ARM STATUS REGISTER BIT DEFINITIONS
PANIC ==200 ;PANIC BUTTON BIT MASK
TOUCH0 ==1 ;TOUCH SENSOR BIT MASKS
TOUCH1 ==2
;DR11C BRAKE REGISTER BIT ASSIGNMENTS
ARMBRK ==77 ;ARM BRAKE BITS
HNDBRK ==100 ;HAND BRAKE BIT
ENBTCH ==4000 ;ENABLE TOUCH SENSOR INTERRUPT
ENABLE ==100000 ;INTERFACE ENABLE
;PROGRAM INITIALIZATION
START: RESET
MOV #1000.,CLKSET
MOV #STKTOP,SP ;INITIALIZE STACK POINTER
MOV #CLKSER,CLKTRP ;SET UP CLOCK VECTOR
MOV #LV7,CLKTRP+2
;ASK IF DAC OR ADC CHECK
MOV #COM1,SG ;ADC OR DAC MODE?
JSR PC,GETNUM
BNE ISADC
;DAC TEST SECTION
DACSEC: CLR DR11S ;SET DR11 DAC MODE
MOV #COM2,SG ;GET DAC CHANNEL
JSR PC,GETNUM
MOVB BRK(R0),R1 ;GET BRAKE MASK BIT
BIS #ENABLE,R1 ;ADD ON INTERFACE ENABLE BIT
MOV R1,BRKMSK
ASH #13.,R0
MOV R0,DACCHN ;SAVE DAC CHANNEL
MOV #COM4,SG ;GET DC DAC VALUE
JSR PC,GETNUM
MOV R0,DACDC
MOV #COM5,SG
JSR PC,GETNUM ;GET DAC RAMP VALUE
MOV R0,DACCHG
CLR COUNT
CLR PDAC ;START AT BOTTOM OF RAMP
CLR PTIME ;INDICATE FIRST PASS THROUGH
CLR NOPANC ;PANIC BUTTON NOT HIT
MOV #111,CLKS ;START THE CLOCK RUNNING
CLKWT: TST NOPANC ;PANIC BUTTON HIT?
BNE DACDN
JSR PC,TICKLE ;SOMEONE TICKLE THE TTY?
BCC CLKWT ;LOOP TILL SOMETHING HAPPENS
DACDN: CLR CLKS ;STOP THE CLOCK
MOV #COM14,SG ;EXIT
JSR PC,LINOUT
JMP DDT
;ADC TEST SECTION
ISADC: MOV #COM6,SG ;ASK IF TYPE OUT REQUESTED
JSR PC,GETNUM
MOV R0,TYPADC
MOV #COM8,SG ;GET STARTING CHANNEL
JSR PC,GETNUM
BIC #177740,R0
MOV R0,ADCCHN ;SAVE START CHANNEL
MOV #COM7,SG ;NUMBER OF CHANNELS TO PRINT
JSR PC,GETNUM
CMP #32.,R0 ;IN RANGE
BGE .+6
MOV #32.,R0 ;NO
TST R0
BGT .+6
MOV #1,R0
ADD ADCCHN,R0 ;LAST CHANNEL NUMBER TO PRINT
DEC R0
MOV R0,MAXCHN
MOV #ADCMDE,DR11S ;SET ADC MODE
TST TYPADC ;CLEAR THE SCREEN
BEQ ADCSTR ;NO
MOV #TOPCLR,SG ;YES
JSR PC,TYPSTR
;ADC LOOP
ADCSTR: MOV ADCCHN,R3 ;FIRST CHANNEL NUMBER
MOV #SPACER,R4 ;THESE ARE SPACERS BETWEEN TYPEOUT
TST TYPADC ;CHECK IF TYPE OUT REQUIRED
BEQ ADCLP ;NO
JSR PC,CRLF ;YES
CMP MAXCHN,ADCCHN ;MORE THAN 1 CHANNEL?
BEQ ADCLP ;NO
MOV #TOP,SG ;YES, MOVE TO TOP OF SCREEN
JSR PC,TYPSTR
ADCLP: MOV R3,DR11O ;SEND OFF DESIRED CHANNEL NUMBER
MOV #100.,R1 ;WAIT LOOP COUNT
WAITLP: BIT #ADCDNE,DR11S
BNE ADCFIN ;BRANCH IF DONE
DEC R1
BGE WAITLP ;REPEAT IF STILL MORE TIME LEFT
MOV #COM9,SG
JSR PC,LINOUT
BR ADCLDN
ADCFIN: MOV DR11I,R0 ;GET ADC READING
TST TYPADC ;CHECK IF TYPE OUT REQUIRED
BEQ TSTDNE ;NO
MOV #IOBUF,SG
JSR PC,PRTINT ;CONVERT TO ASCII
MOV #IOBUF,SG ;TYPE OUT READING
JSR PC,TYPSTR
MOV R4,SG ;TYPE OUT SPACER
MOV (SG)+,R4 ;POINT TO NEXT SPACER
JSR PC,TYPSTR
TSTDNE: JSR PC,TICKLE ;TTY TICKLED?
BCS ADCLDN ;YES
INC R3 ;NEXT CHANNEL NUMBER
CMP MAXCHN,R3 ;END OF LIST
BLT ADCSTR ;YES
BR ADCLP ;NO
ADCLDN: MOV #COM14,SG ;EXIT
JSR PC,LINOUT
JMP DDT
;SUBRS AND CLOCK INTERRUPT ROUTINE
GETNUM: JSR PC,TYPSTR ;TYPE OUT QUESTION
MOV #IOBUF,SG ;GET THE REPLY
JSR PC,INSTR
JSR PC,GETINT
MOV #COM13,SG ;REPEAT IF BAD NUMBER
BCS GETNUM
TST R0
RTS PC
CLKSER: MOV DACDC,R0 ;GET DAC OUTPUT VALUE
ADD PDAC,R0
MOV R0,R1
BGE .+4 ;CHECK IF IN RANGE
NEG R1
CMP #4000,R1
BGE VALOK ;BRANCH IF OK
MOV DACDC,R0 ;ELSE START OVER AT DC VALUE
MOV DACCHG,PDAC
NEG PDAC
; MOV #1,DR11S ;USE THIS TO SYNC ON WHEN TESTING
; MOV BRKMSK,DR11O
VALOK: TST PTIME ;CHECK IF NOT FIRST PASS THROUGH
BNE 1$ ;BRANCH IF NOT PASS ONE
MOV #1,DR11S ;ELSE SET BRAKE MODE
MOV BRKMSK,DR11O ;TURN OFF BRAKE AND ENABLE INTERFACE
INC PTIME ;INDICATE END OF FIRST PASS
1$: BIC #170000,R0
BIS DACCHN,R0 ;ADD DAC CHANNEL
CLR DR11S
MOV R0,DR11O
ADD DACCHG,PDAC
MOV #STTMDE,DR11S ;GET ARM STATUS BITS
MOV DR11I,R0
BIT #PANIC,R0 ;CHECK IF PANIC BUTTON HIT
BEQ STPIT ;STOP SERVICING IF BUTTON HIT
RTI
STPIT: INC NOPANC
MOV #BRKMDE,DR11S ;SET THE BRAKES
CLR DR11O
RTI
;LOCAL STORAGE
BRK: .BYTE 1,2,4,10,20,40,100,0
BRKMSK: 0
NOPANC: 0
DACCHN: 0
DACDC: 0
DACCHG: 0
PDAC: 0
COUNT: 0
PTIME: 0
TYPADC: 0
INDX: 0
ADCCHN: 0
MAXCHN: 0
;OUTPUT STRINGS
COM1: .ASCIZ /DAC OR ADC(0:1) = /
COM2: .ASCIZ /DAC NUMBER (0:7) = /
COM4: .ASCIZ /DAC DC VALUE (-2048 : 2047) = /
COM5: .ASCIZ /DAC CHANGE EVERY 10 MSEC = /
COM6: .ASCIZ /TYPE ADC READINGS (0:1)? = /
COM7: .ASCIZ /NUMBER OF CHANNELS TO PRINT (1:32) = /
COM8: .ASCIZ /ADC CHANNEL (0:31) = /
COM13: .ASCIZ /**ILLEGAL NUMBER**, TRY AGAIN = /
COM9: .ASCIZ /**ERROR** NO ADC DONE SIGNALED/
COM14: .ASCIZ /EXITING TO DDT/
TOP: .BYTE 35,10,10,10,10,0
TOPCLR: .BYTE 35,35,37,37,37,10,10,10,0
.EVEN
SPACER: SPACE2
.ASCIZ /* /
SPACE1: SPACE2
.ASCIZ / /
SPACE2: SPACE3
.ASCIZ / /
SPACE3: SPACE4
.ASCIZ / /
SPACE4: SPACE1
.BYTE 15,12,0,0
.EVEN
IOBUF: .=.+200
PATCH: .=.+300
.END START